 /* eslint-disable no-async-promise-executor */
 const model = require("../models/model")
 const Files = model.files.Files // 获取模型
 const path = require('path')
 const fs = require('fs')
 const dirnameImage = path.join(__dirname, '../../server-files/images') // 存放文件的目录
 const { getFile } = require('../models/getfile')
 require('dotenv').config()
 // const { PRO_API, DEV_API } = process.env
 // 判断文件目录是否存在 不存在则创建文件夹
 function access(catalog) {
   return new Promise((resolve) => {
     // 目录是否存在
     fs.access(catalog, async(err) => {
       // 文件和目录不存在的情况下 创建文件目录再执行
       if (err != null && err.code == "ENOENT") {
         console.log("目录不存在")
         fs.mkdir(catalog, async(err) => {
           if (err) {
             console.log('创建目录失败')
             resolve(false)
           } else {
             resolve(true)
           }
         })
       } else {
         resolve(true)
       }
     })
   })
   
 }
 
 // 上传图片到本地服务器
 exports.image = async(ctx) => {
   // 获取上传单个文件（2）
   const file = ctx.request.files.file // 获取上传文件
   if (!file) {
    ctx.fail('请上传文件')
    return
  }
   const fileType = file.name.substring(file.name.lastIndexOf('.') + 1) // 获取后缀格式
   const typeName = file.type.substring(0, file.type.lastIndexOf('/')) // 获取文件格式 用于判断
   if (typeName != 'image') {
     ctx.fail('文件格式错误，只能上传图片')
     return
   }
   function imagesUpload() {
     return new Promise(async(resolve) => {
       const isAccess = await access(dirnameImage)
       if (isAccess) { // 有目录
         const add_file = await Files.create({ 
           name: file.name,
           size: file.size,
           type: fileType
         })
         if (add_file) {
           const reader = fs.createReadStream(file.path)
           let filePath = dirnameImage + `/${add_file.id}.${fileType}`
           // 创建可写流
           const upStream = fs.createWriteStream(filePath)
           // 可读流通过管道写入可写流
           reader.pipe(upStream)

           reader.on('error', (err) => {
              // 处理可读流错误
              resolve(-1)
            });
           reader.on('close', async() => {
             // 可读流关闭时的处理
             // 获取地址
             const url_res = await getFile(add_file.id)
             if (url_res) {
               resolve({
                 id: add_file.id,
                 url: url_res
               })
             }
           })
           // 重命名
          //  fs.rename(filePath, dirnameImage + `/${add_file.id}.${fileType}`, async(err) => {
          //    if (err) {
          //     console.log('重命名失败')
          //      resolve(-1)
          //    } else {
          //      // 获取地址
          //      console.log('获取地址')
          //      const url_res = await getFile(add_file.id)
          //      if (url_res) {
          //        resolve({
          //          id: add_file.id,
          //          url: url_res
          //        })
          //      }
          //    }
          //  })
         }
       } else {
         resolve(-1)
       }
     })
   }
   // 返回信息
   const res = await imagesUpload()
   if (res != -1) {
     ctx.success({id: res.id, name: file.name, url: res.url}, '上传成功')
   } else {
     ctx.fail('未知错误', -1)
   }
 }
 // 上传图片到七牛云
 exports.qiniuImage = async(ctx) => {
   const { uploadQiniu } = require('../util')
   const file = ctx.request.files.file // 获取上传文件
   if (!file) {
     ctx.fail('未上传图片')
     return
   }
   if (file.size > (1024 * 1024  * 5)) { // 限制大小（防止七牛云空间被恶意占用空间）
     ctx.fail('最大只能上传5mb文件')
     return false
   }
   const ext = file.name.split('.').pop() // 获取文件后缀扩展格式
   const fileType = file.type.split('/')[0] // 获取文件格式（用于判断）
   if (fileType != 'image') {
     ctx.fail('文件格式错误，只能上传图片')
     return
   }
 
   // 总方法
   function allFn() {
     return new Promise(async(resolve) => {
       const add_file = await Files.create({ 
         name: file.name,
         size: file.size,
         type: ext
       })
       if (add_file) { // 数据库创建信息成功
         // 创建文件可读流
         const reader = fs.createReadStream(file.path)
         // 命名文件以及拓展名
         const fileUrl = `${add_file.id}.${ext}`
         // 使用封装好的七牛云上传方法
         await uploadQiniu(reader, fileUrl)
         resolve({
           id: add_file.id,
           name: file.name,
           url: `http://files.jiangtao.ltd/${fileUrl}`
         })
         // if (res === -1) { // 如果上传失败了就再删除数据库的信息
         //   Files.destroy({ where : { id: add_file.id }}).then(() => {
         //     resolve(-1)
         //   })
         // } else { // 上传成功了就把文件信息返回
         //   resolve({
         //     id: add_file.id,
         //     name: file.name,
         //     url: res
         //   })
         // }
       }
     })
   }
   const res = await allFn()
   if (res !== -1) {
     ctx.success(res, '上传成功')
   } else {
     ctx.success('上传失败')
   }
 }
 